package com.dragon.modules.yuegou.client.wechat_mini.common;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;

import javax.annotation.Nullable;
import java.io.Serializable;

/**
 * 返回数据封装类统一基类
 * 
 * @author liuwu
 * @date 2017年12月25日
 *
 */
@SuppressWarnings("serial")
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class BaseResponse implements Serializable {

	/**
	 * 错误码，0或null表示成功
	 */
	@Nullable
	protected Integer errcode;

	/**
	 * 错误信息
	 */
	@Nullable
	protected String errmsg;

	/**
	 * 获取错误码
	 * 
	 * @return 错误码，0或null表示成功
	 */
	@Nullable
	public Integer getErrcode() {
		return errcode;
	}

	/**
	 * 设置错误码
	 * 
	 * @param errcode 错误码，0或null表示成功
	 */
	public void setErrcode(@Nullable Integer errcode) {
		this.errcode = errcode;
	}

	/**
	 * 获取错误信息
	 * 
	 * @return 错误信息
	 */
	@Nullable
	public String getErrmsg() {
		return errmsg;
	}

	/**
	 * 设置错误信息
	 * 
	 * @param errmsg 错误信息
	 */
	public void setErrmsg(@Nullable String errmsg) {
		this.errmsg = errmsg;
	}

	/**
	 * 判断是否业务操作成功
	 * 
	 * @return true表示业务操作成功，false表示业务操作失败
	 */
	@JsonIgnore
	public boolean isOk() {
		return errcode == null || errcode.equals(0);
	}

	/**
	 * 判断是否返回了某个错误码
	 * 
	 * @param code 错误码
	 * @return true表示返回了该错误码，false表示未返回该错误码
	 */
	@JsonIgnore
	public boolean is(MiniCode code) {
		return errcode != null && errcode.intValue() == code.getCode();
	}

	/**
	 * 判断（本次调用使用的）接口调用凭证是否失效了
	 * 
	 * @return true表示接口调用凭证失效了，false表示未失效
	 */
	@JsonIgnore
	public boolean isAccessTokenExpired() {
		return errcode != null && errcode.intValue() == MiniCode.INVALID_SECRET_TOKEN.getCode();
	}

	/**
	 * 判断（本次调用使用的）接口调用凭证有效
	 * 
	 * @return true表示接口调用凭证有效，false表示接口调用凭证无效
	 */
	@JsonIgnore
	public boolean isAccessTokenValid() {
		return errcode == null || errcode.intValue() != MiniCode.INVALID_SECRET_TOKEN.getCode();
	}

	/**
	 * 检查返回码,把返回码转化为异常抛出
	 * 
	 * @throws MiniBusinessException 业务失败
	 */
	public void check() throws MiniBusinessException {
		if (this.isOk()) {
			return;
		}
		MiniCode code = MiniCode.from(errcode);
		if (code != null) {
			throw new MiniBusinessException(code, errmsg);
		} else {
			throw new MiniBusinessException(errcode, errmsg);
		}
	}

}
